� ����� �� ����� ����������� � ��������� ���������� ������ �����. ��������, ����� ����������� ������ � ���� int array[25], �� ���� ������������ �� ������ ��������� ������ ��� �������� ���� ��������� �������, �� � ��� ��������� � ������ array, �������� �������� ����� ������ ������� �� ����� (��������) �������� �������, �.�. ��� ������ �������� ����������, � ������ � ��������� ������� �������������� ����� ��������� � ������ array. � ����� ������ ���������� ����� ��������� arrey �������� ����������, �������� ������� ����� ������������ � ����������, �� �������� ��� �������� ������.
��������� ��� ������� �������� ���������� ���������, ��������, ����� ������������:
int arrey[25]; int *ptr; ptr=array;
����� ��������� ptr ��������������� �� ����� ������� �������� ���c���, ������ ������������ ptr=arrey ����� �������� � ������������� ����� ptr=&arrey[0].
��� ������� � ��������� ������� ���������� ��� ��������� �������. ������ ������ ������ � �������������� ������� ��������� ��������� � ���������� �������, ��������, array[16]=3 ��� array[i+2]=7. ��� ����� ������� ������� ������������ ��� ���������, ������ ������ ��������� ����������� � ���������� ������. ���� �� ���� ��������� ������ ���� ����������, � ������ - ���������� ������ ����. ������������������ ������ ���� ��������� ����� ���� �����, �� � ���������� ������� ������������ ��������� ��������� ������. ������� ������ array[16] � 16[array] ����� �������������� � ���������� ������� ������� � ������� �����������. ��������� ������������ � ��������� ��������� �� ����������� ������ ���� ����������, ����������� �� �����-���� ������, ��� ����� ���� � ����������. � ��������� ����� ���������� ������������ ptr=array ������ � ������������� �������� ������� ����� �������� � ������� ��������� ptr � ����� ptr[16] ��� 16[ptr].
������ ������ ������� � ��������� ������� ������ � �������������� �������� ��������� � �������� ������������ � ����� *(array+16)=3 ��� *(array+i+2)=7. ��� ����� ������� ������� �������� ��������� ������ ������ ������������� �������� ������� ���� ����� ���� �������� ������� ��������� *(array+16) ��� *(16+array).
��� ���������� �� ���������� ������ ������ ���������� �� �������, �.�. ��������� ��������� ������������� � ���������. ��� ����������� �������� array[16] � 16[array] ������������� � *(array+16).
��� ������� � ���������� �������� ������� (�.�. � �������� � ������� ��������) ����� ������������ ������ �������� ��������� array ��� ptr. ����� �� ������������
*array = 2; array[0] = 2; *(array+0) = 2; *ptr = 2; ptr[0] = 2; *(ptr+0) = 2;����������� ���������� �������� ������� �������� 2, �� ������� ����� ���������� ������������ *array=2 � *ptr=2, ��� ��� � ��� �� ��������� ��������� �������� ��������.
��������� �� ����������� ������� � ����� �� - ��� ������� ��������, �.�. ����� �������, ���������� ������� �������� �������. ��� ���������� ����� �������� � ������ ���������� ��������� ��������� ��������� ��������. �������� ��� ���������� ���������� ���������� ������� int arr2[4][3] � ������ ���������� ������� ��� �������� �������� ���������� arr, ������� �������� ���������� �� ������ �� ������� ����������. ��� ����� ������� �� ������� ���������� ���� ���������� ������. ������ �� ���� ������� ���������� �������� ����� ������� �� ���� ��������� ���� int, �, �������������, � ������ ���������� ���������� ������ ������� ��� �������� ������� �������� ����� ���� int, ������ �� ������� ������� �� ���� ���������. ����� ��������� ������ �������� �� ����� �� ���.3.
arr | ||||
� | ||||
---|---|---|---|---|
arr[0] | � | arr[0][0] | arr[0][1] | arr[0][2] |
arr[1] | � | arr[1][0] | arr[1][1] | arr[1][2] |
arr[2] | � | arr[2][0] | arr[2][1] | arr[2][2] |
arr[3] | � | arr[3][0] | arr[3][1] | arr[3][2] |
���.3. ������������� ������ ��� ���������� �������. |
����� �������, ���������� arr2[4][3] ��������� � ��������� ��� ������ �������: ��������� � ��������������� arr, ���������� ������ �� ������� ���������� � ���������� ������ �� ���������� ����� ���� int. ��� ������� � ���������� �������� ������������ �������� ��������� � ���������� arr. ������ � ��������� ������� ���������� �������������� � ��������� ������ ���������� ��������� � ����� arr2[2] ��� *(arr2+2). ��� ������� � ��������� ���������� ������� ����� ���� int ������ ���� ������������ ��� ��������� ��������� � ����� arr2[1][2] ��� ������������� �� *(*(arr2+1)+2) � (*(arr2+1))[2]. ������� ���������, ��� � ����� ������ ���������� ����� �� ��������� arr � ��������� arr[0], arr[1], arr[2], arr[3] �������� ����������� � �� �������� ������ �������� �� ����� ���������� ���������.
���������� ����������� ������� ���������� ���������� � ���������� float arr3[3][4][5] ��������� � ��������� ����� ������ ����������� ������� �� ����������� ����� ���� float ������ �� ������� ���������� �� ��� float, ������ �� ���� ���������� �� ������ ���������� �� float, � ��������� �� ������ �������� ���������� �� float.
��� ���������� ��������� ����������� �������� ��� ������������� � ������ ������ �� �������, �.�. ������� ����� ���������� ��������� ������, � ��������� - ������. ����� ������� ���� ����������� ���������� � ������ �������� ������������ �������, ��������� ����� ��� ���������� �������� � ������ ���� ��������� ���������.
��������, ��������� � �������� arr2[1][2] ����� ����������� � ������� ��������� ptr2, ������������ � ����� int *ptr2=arr2[0] ��� ��������� ptr2[1*4+2] (����� 1 � 2 ��� ������� ������������� ��������, � 4 ��� ����� ��������� � ������) ��� ��� ptr2[6]. �������, ��� ������ ������� ��������� arr2[6] ��������� ���������� ��� ��� ��������� � �������� 6 �� ����������.
��� ��������� � �������� arr3[2][3][4] �� ����������� ������� ���� ����o ������������ ���������, ��������� ��� float *ptr3=arr3[0][0] � ����� ��������� ���������� � ����� ptr3[3*2+4*3+4] ��� ptr3[22].
����� ��������� �������, ����������� ����� ����������� ������� � ���������� �������. � ������� ���������� ����� ���������� �������� � ������� �������, ������������ �������� - ��������� �� ���������, ���������� ������� ������������ ��������.
struct INDEX { int i, int j, int k } min_index ; struct INDEX * find_min (int *ptr1, int l, int m int n) { int min, i, j, k, ind; min=*ptr1; min_index.i=min_index.j=min_index.k=0; for (i=0; i*(ptr1+ind) { min=*(ptr1+ind); min_index.i=i; min_index.j=j; min_index.k=k; } } return &min_index; }
��� ����������� ����� ��������� ������� ��������: ��������� � ���������. ��� ���������� �������� ++ � -- �������� ��������� ������������� ��� ����������� �� ����� ����, �� ������� ��������� ������������ ���������.
������:
int *ptr, a[10]; ptr=&a[5]; ptr++; /* ����� ������ �������� a[6] */ ptr--; /* ����� ������ �������� a[5] */
� �������� ��������� �������� � ��������� ����� ����������� ��������� � �������� ���� int. ��� ���� ����������� �������� ����� ��������� �� �������� ���, � ��� �������� ����� �� ��������� ����� ��������� ������ ��� ������ ���������.
������:
int *ptr1, *ptr2, a[10]; int i=2; ptr1=a+(i+4); /* ����� ������ �������� a[6] */ ptr2=ptr1-i; /* ����� ������ �������� a[4] */
� �������� ��������� ����� ����������� ��� ��������� �� ���� � ��� �� ���. ��������� ����� �������� ����� ��� int � ����� ����� ��������� ��������� ���� ����� ����������� � ����������, ������ ���� ������ ����� ������, �� ��������� ����� ������������� ��������.
������:
int *ptr1, *ptr2, a[10]; int i; ptr1=a+4; ptr2=a+9; i=ptr1-ptr2; /* ����� 5 */ i=ptr2-ptr1; /* ����� -5 */
�������� ���� ���������� �� ���������� ���� ����� ���������� � ��������� ==, !=, <, <=, >, >= ��� ���� �������� ���������� ��������������� ������ ��� ����� �����, � ��������� ��������� ����� 0 (����) ��� 1 (������).
������:
int *ptr1, *ptr2, a[10]; ptr1=a+5; ptr2=a+7; if (prt1>ptr2) a[3]=4;
� ������ ������� �������� ptr1 ������ �������� ptr2 � ������� �������� a[3]=4 �� ����� ��������.
� ����� �� �������� �������� ����� ����� ����� ���, �, � ���������, ����� ���� ����������� �� ����� ���. ���������� ��������� �������� � �������������� ����������.
��������� ���������� ����������
int a[]={10,11,12,13,14,}; int *p[]={a, a+1, a+2, a+2, a+3, a+4}; int **pp=p;
��������� ����������� �������, �������������� �� ����� �� ���.4.
pp | ||||||
� | ||||||
---|---|---|---|---|---|---|
p | � | . | . | . | . | . |
� | � | � | � | � | ||
a | � | 11 | 12 | 13 | 14 | 15 |
���.4. ����� ���������� ���������� ��� ����������. |
��� ���������� �������� pp-p ������� ������� ��������, ��� ��� ������ pp � p ����� � ��������� �� ��������� ������� ������� ����������, ���������� � ���������� p ( �� ������� p[0]).
����� ���������� �������� pp+=2 ����� ��������� � ������ ���, ������������ �� ���.5.
pp | ||||||||
� | ||||||||
---|---|---|---|---|---|---|---|---|
p | � | . | . | . | . | . | ||
� | � | � | � | � | ||||
a | � | 10 | 11 | 12 | 13 | 14 | ||
���.5. ����� ���������� ���������� ����� ���������� �������� pp+=2. |
����������� ���������� ��������� pp-p ����� 2, ��� ��� �������� pp ���� ����� �������� �������� ������� p. ������ *pp-a ���� ���� �������� 2, ��� ��� ��������� *pp ���� ����� �������� �������� ������� a, � ��������� a ���� ����� ���������� �������� ������� a. ��� ��������� � ������� ������ **pp ������� 12 - ��� �������� �������� �������� ������� a. ������ *pp++ ���� �������� ���������� �������� ������� p �.�. ����� ���������� �������� ������� a.
���� �������, ��� pp=p, �� ��������� *++pp ��� �������� ������� �������� ������� a (�.�. �������� 11), �������� ++*pp ������� ���������� ��������� p[0], ����� �������, ��� �� ������ ������ �������� ������ �������� a[1].
������� ��������� ������������ �������. �������� ��������� *(++(*pp)) ����� ������� �� ��������� ��������: *pp ���� �������� ���������� �������� ������� p[0], ����� ��� �������� ��������������� ++(*p) � ���������� ���� ��������� p[0] ������ ����� �������� ������ �������� a[1], � ��������� �������� ��� ������� �������� �� ����������� ������, �.�. �������� 11.
� ���������� �������� ��� ����������� ���������� ������, ���������� ������ ������ � ����������� �������� � �����������. ��������� ���������� ����������
int a[3][3]={ { 11,12,13 }, { 21,22,23 }, { 31,32,33 } }; int *pa[3]={ a,a[1],a[2] }; int *p=a[0];
��������� � ��������� ������� �������������� �� ����� �� ���.6.
�������� ���� ����� ������ � �������� a[0][0] �������� �� ���������� a, p, pa ��� ������ ��������� ������: a[0][0], *a, **a[0], *p, **pa, *p[0].
���������� ������ ������ � �������������� ����� ��������. ���������� ����������
char *c[]={ "abs", "dx", "yes", "no" }; char **cp[]={ c+3, c+2 , c+1 , c }; char ***cpp=cp;
����� ���������� ������ �������������� �� ���.7.
��� ������������ ������������� ������ ��� �������� ������� ������� ��������������� ��������� � ����������� ��� �������� ��� ������ ������� calloc. ���������� ������ a[10] �� ��������� ���� float ����� ������� ��������� �������
float *a; a=(float*)(calloc(10,sizeof(float));
��� �������� ���������� ������� ������� ����� ������������ ������ ��� ������� ���������� �� ���������� �������, � ����� ������������ ������ ��� ���������� ��������. �����, ��������, ��������� ������� ������ a[n][m], ��� ����� ������� ��� ������ ���������� ��������� ���������:
#includemain () { double **a; int n,m,i; scanf("%d %d",&n,&m); a=(double **)calloc(m,sizeof(double *)); for (i=0; i<=m; i++) a[i]=(double *)calloc(n,sizeof(double)); . . . . . . . . . . . . }
����������� ������� ����� ������������ ������ � ��� ����������� ������� �������� n,m,l. ������� ������ �������, ��� �������� ��� ����������� ���������� ��������� ������ ������� ����������� ��� ������ ������� free.
#includemain () { long ***a; int n,m,l,i,j; scanf("%d %d %d",&n,&m,&l); /* -------- ������������� ������ -------- */ a=(long ***)calloc(m,sizeof(long **)); for (i=0; i<=m; i++) { a[i]=(long **)calloc(n,sizeof(long *)); for (j=0; i<=l; j++) a[i][j]=(long *)calloc(l,sizeof(long)); } . . . . . . . . . . . . /* --------- ������������ ������ ----------*/ for (i=0; i<=m; i++) { for (j=0; j<=l; j++) free (a[i][j]); free (a[i]); } free (a); }
���������� ��� ���� ���������� ������, � ������� ������ ��� �������� �������������� � ���������� �������, � ������������ � ����������. � ����� ������ � ���������� ������� ��������� ���������� ���������, ������� ����� ��������� ������ ���������� ��� �������� ������.
������: #includemain() { int vvod(double ***, long **); double **a; /* ��������� ��� ������� a[n][m] */ long *b; /* ��������� ��� ������� b[n] */ vvod (&a,&b); .. /* � ������� vvod ���������� ������ ����������, */ .. /* � �� �� �������� */ .. } int vvod(double ***a, long **b) { int n,m,i,j; scanf (" %d %d ",&n,&m); *a=(double **)calloc(n,sizeof(double *)); *b=(long *)calloc(n,sizeof(long)); for (i=0; i<=n; i++) *a[i]=(double *)calloc(m,sizeof(double)); ..... }
������� ����� �� ��������������, ��� ��������� �� ������ �� ����������� ������ ���������� �� ��������� ������� ���������� �������. �� ����� ���� ������� ���, ��� ��������� ������� ����� ����� ������ �������� �� ����, ������ �� ����� ���� ��� ������������� ��� � �������������.
������:
#includeint main() { float *q, **b; int i, j, k, n, m; scanf("%d %d",&n,&m); q=(float *)calloc(m,sizeof(float)); /* ������ ��������� q ���������� �� ������ ������� */ q[0]=22.3; q-=5; /* ������ ��������� ������� ������� ����� ������ 5, */ /* � �������� ������� ������ n-5 */ q[5]=1.5; /* ����� ������� �� �������� � ����������������� */ /* ������� � ������ � ��������� ��������� ������� */ q[6]=2.5; /* - ��� ������ ������� */ q[7]=3.5; /* - ��� ������ ������� */ q+=5; /* ������ ��������� ������� ����� ����� ������ 0, */ /* � �������� ��������� q[0], q[1], q[2] ����� */ /* �������������� 1.5, 2.5, 3.5 */ q+=2; /* ������ ��������� ������� ����� ������ -2, */ /* ��������� -1, ����� 0 � �.�. �� ������� */ q[-2]=8.2; q[-1]=4.5; q-=2; /* ���������� ��������� ����������, ��� ������ */ /* �������� ������� q[0], q[1], q[2], ����� */ /* �������� 8.2, 4.5, 3.5 */ q--; /* ����� ������� ���������� . */ /* ��� ������������ ������� ������ � ������� �������� */ /* ������ q ������������ ������� free(q), �� ��������� */ /* �������� ��������� q �������, �� ���������� */ /* ������� free(q) �������� � ��������������� ������������. */ /* ��� ����������� ���������� ���� ������� */ /* ��������� q ������ ���� ��������� � �������������� */ /* ��������� */ free(++q); /* ���������� ����������� ��������� ���������� � */ /* ������������ ������ ��� ���������� ������� */ b=(float **)calloc(m,sizeof(float *)); for (i=0; i < m; i++) b[i]=(float *)calloc(n,sizeof(float)); /* ����� ������������� ������ ��������� ��������� */ /* ������� ����� ������� b[0][0] */ /* �������� ����� �������� ���, ����� ��������� */ /* ��������� ���� ������� b[1][1] */ for (i=0; i < m ; i++) --b[i]; b--; /* ������ �������� ������� �������� ������� ����� ��� */ /* �������� */ for (i=1; i<=m; i++) for (j=1; j<=n; j++) b[i][j]=(float)(i+j); /* �������� �������� �� ��������� �������� ��������� */ /* ������ i � j, �� ���������� � 1 � �� � 0 */ /* ����������� � ������� ���������� */ for (i=1; i<=m; i++) ++b[i]; b++; /* �������� ������������ ������ */ for (i=0; i < m; i++) free(b[i]); free(b); ... ... return 0; }
� �������� ���������� ������� ���������� ������������ ������������� ������ ��� ������� ���������� �� �������, ������� ���� ������� �������� ���� double � ������������ �������� ���� double.
������:
#include#include double cos(double); double sin(double); double tan(double); int main() { double (*(*masfun))(double); double x=0.5, y; int i; masfun=(double(*(*))(double)) calloc(3,sizeof(double(*(*))(double))); masfun[0]=cos; masfun[1]=sin; masfun[2]=tan; for (i=0; i<3; i++); { y=masfun[i](x); printf("\n x=%g y=%g",x,y); } return 0; }